Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: 烈火   发起时间: 2014-09-05 01:52 上午   回复: 2

Print Search
帖子排序:    
   2014-09-05, 01:52 上午
FireBurn 离线,最后访问时间: 2014/2/10 8:02:11 烈火

发帖数前50位
注册: 2013-01-26
发 贴: 28
请教一个Access Violation的问题
Reply Quote
最近在编写一个视频采集的软件,使用设备提供的SDK获取位图图像,获取图像的函数声明如下:

bool GetImageData(void * buffer);

现在发现在调用这个函数的时候的经常出现Access Violation的情况(但也不是每次都出现),调试信息如下

(ae0.b80): Access violation - code c0000005 (!!! second chance !!!)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for D:\F50 SDK\AVerCamSDK\bin\AVerCamSdk_SA.dll - 
eax=0abe0020 ebx=0863ff08 ecx=00300000 edx=00000000 esi=0abe0020 edi=07710020
eip=62989051 esp=0863fee8 ebp=0863ff30 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
AVerCamSdk_SA!averCamStartup+0x772d:
62989051 f3a4            rep movs byte ptr es:[edi],byte ptr [esi]

出错的指令地址是在SDK提供的Dll里面,其中edi保存的就是传入函数中的buffer地址,esi应该是sdk使用的地址。

分别查看这两个地址:

0:008> !address 0abe0020
Usage:                  Heap
Base Address:           0abe0000
End Address:            0aee1000
Region Size:            00301000
State:                  00001000 MEM_COMMIT
Protect:                00000004 PAGE_READWRITE
Type:                   00020000 MEM_PRIVATE
Allocation Base:        0abe0000
Allocation Protect:     00000004 PAGE_READWRITE
More info:              heap owning the address: !heap 0x41a0000
More info:              heap large/virtual block
More info:              heap entry containing the address: !heap -x 0xabe0020


0:008> !address 7710020
Usage:                  Heap
Base Address:           07710000
End Address:            07a11000
Region Size:            00301000
State:                  00001000 MEM_COMMIT
Protect:                00000004 PAGE_READWRITE
Type:                   00020000 MEM_PRIVATE
Allocation Base:        07710000
Allocation Protect:     00000004 PAGE_READWRITE
More info:              heap owning the address: !heap 0x41a0000
More info:              heap large/virtual block
More info:              heap entry containing the address: !heap -x 0x7710020

看起来似乎没什么问题,从ecx上看,rep movs byte访问的范围是0x300000,也没有越界访问,为什么会报AccessViolation异常呢?

SDK附带的sample就没有出现这个问题,不同的是sample是在主线程里面使用定时器进行访问,每次调用后都会把buffer删除掉。而我是在一个工作线程里面调用这个函数,buffer也是固定的。不过感觉这个应该和发生异常没有关系吧。

IP 地址: 已记录   报告
   2014-09-05, 15:36 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Huh? [:^)] Re: 请教一个Access Violation的问题
Reply Quote
圆刚的捕捉卡,激起很多回忆啊 :-)

如需帮忙,发完整的dump来

IP 地址: 已记录   报告
   2014-09-30, 22:41 下午
FireBurn 离线,最后访问时间: 2014/2/10 8:02:11 烈火

发帖数前50位
注册: 2013-01-26
发 贴: 28
Re: 请教一个Access Violation的问题
Reply Quote
真是惭愧,居然一晃就到月底了。
那天后来再看看SDK,改成使用回调的方式,就再也没有发生上面的问题了。
奉上后来在客户机上作的一次dump,地址http://url.cn/OvbLOD ,麻烦雷老师拨冗指教

IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » 请教一个Access Violation的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.